package cn.neusoft.cglib;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibProxyFactory {

    Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

    public Object getProxy(){

        //cglib本身需要进入jar包才能使用   spring集成了cglib
        Enhancer enhancer = new Enhancer();

        //创建代理子类  设置父类类型
        enhancer.setSuperclass(target.getClass());
        //设置回调  业务方法调用时植入的内容
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {

                String methodName = method.getName();

                if (methodName.contains("add") || methodName.contains("update") || methodName.contains("del")){
                    System.out.println("开启事务");
                    //method就是目标类要执行的业务方法  比如add  update
                    //对象.方法(参数)
                    try {
                        Object result = method.invoke(target, args);
                        System.out.println("提交事务");
                        return result;
                    }catch (Exception e){
                        e.printStackTrace();
                        System.out.println("回滚事务");
                        return null;
                    }finally {
                        System.out.println("关闭事务");
                    }
                }else if(methodName.contains("get")){
                    System.out.println("开启事务");
                    //method就是目标类要执行的业务方法  比如add  update
                    //对象.方法(参数)
                    try {
                        Object result = method.invoke(target, args);
                        return result;
                    }catch (Exception e){
                        e.printStackTrace();
                        return null;
                    }finally {
                        System.out.println("关闭事务");
                    }
                }else{
                    //不是业务方法   正常执行即可
                    return  method.invoke(target, args);
                }
            }
        });

        //创建代理对象
        return enhancer.create();
    }
}
